/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarAperturaPostgrado;

import web.util.Constantes;
import com.sun.rave.web.ui.model.UploadedFile;
import entidad.Profesor;
import entidad.apertura.Solicitudaperturapostgrado;
import hero.interfaces.BnNodeValue;
import java.io.File;
import java.io.FileNotFoundException;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import wasolicitudesfiec.AperturaPostgrado.SolicitarAperturaPostgrado;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.*;
import web.util.SendMailEspol;

/**
 *
 * @author kabad
 */
public class CTRL_SolicitarAperturaPostgrado extends CTRL_Base {

    private SolicitarAperturaPostgrado gui;
    private final String nombreProcesoPostgrado = Constantes.Modelo.modelo_SolicitarAperturaPostgrado;
    private final String nombreActividadPostgrado = Constantes.SolicitarAperturaPostgrado.solicitarApertura;
    private boolean iteracion = false;

    public CTRL_SolicitarAperturaPostgrado(SolicitarAperturaPostgrado gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
    }

    public void inicializar() throws MensajeException {
        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
        }
        hLisIteracion();
        /************************************************************
         *Verificar si viene de una iteraccion si es asi hay que precargar la informacion
         ***********************************************************/
        if (isIteracion()) {
            precargarDatosSiEsPosible();
        } else {
            gui.getMenu().setTitulo("Formulario " + Constantes.TipoSolicitud.AperturaPostgrado.toString());
        }
    }

    private void hLisIteracion() {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        try {
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                setIteracion(false);
                return;
            }
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividadPostgrado);

            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            if (actividad.getStartDate() != null) {
                setIteracion(true);
            } else {
                setIteracion(false);
            }
        } catch (Exception ex) {
            setIteracion(false);
        }
    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");
        return instancia;
    }

    public boolean isIteracion() {
        return iteracion;
    }

    public void setIteracion(boolean iteracion) {
        this.iteracion = iteracion;
        if (iteracion) {
            gui.getLblTipo().setVisible(true);
            gui.getDdlTipoPostgrado().setVisible(false);
            gui.getLblArchivoAdjunto().setVisible(true);
            gui.getLinkArchivoAdjunto().setVisible(true);
        } else {
            gui.getLblTipo().setVisible(false);
            gui.getDdlTipoPostgrado().setVisible(true);
            gui.getLblArchivoAdjunto().setVisible(false);
            gui.getLinkArchivoAdjunto().setVisible(false);
        }
    }

    private void precargarDatosSiEsPosible() throws MensajeException {
        BnNodeValue actividad;
        String nombreInstanciaProceso;
        Solicitudaperturapostgrado solicitud;
        int idSolicitudAyudantia;
        try {
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso != null) {
                this.inicializarInstancia(nombreInstanciaProceso);
            }
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividadPostgrado);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            if (actividad.getStartDate() != null) {
                idSolicitudAyudantia = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
                solicitud = logica.getLogAperturaPostgrado().leerSolicitudApertura(idSolicitudAyudantia);
                gui.getLblTipo().setText(solicitud.getTipo());
                gui.getTxtaTema().setValue(solicitud.getTema());
                gui.getMenu().setTitulo(nombreProcesoPostgrado + "_" + idSolicitudAyudantia + ": " + nombreActividadPostgrado);
                if (solicitud.getPathArchivoAdjunto() != null) {
                    gui.getLblArchivoAdjunto().setRendered(true);
                    gui.getLinkArchivoAdjunto().setRendered(true);
                    gui.getLinkArchivoAdjunto().setText(solicitud.getNombreArchivo());
                    gui.getLinkArchivoAdjunto().setUrl(Constantes.Rutas.rutaArchivos + solicitud.getPathArchivoAdjunto().replaceAll(" ", "%20"));
                } else {
                    gui.getLblArchivoAdjunto().setRendered(false);
                    gui.getLinkArchivoAdjunto().setRendered(false);
                }
            }

        } catch (Exception ex) {
            ex.printStackTrace();
            Logger.getLogger(CTRL_SolicitarAperturaPostgrado.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }
    }

    public void guardarActividadSolicitarAperturaPostgrado() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        Solicitudaperturapostgrado solicitud = new Solicitudaperturapostgrado();
        int idSolicitud;
        try {

            if (!gui.getFuArchivo().getValueAsString(facesContext).equals("")) {
                String nombreArchivo = (String) gui.getFuArchivo().getValueAsString(facesContext);
                if (nombreArchivo.indexOf(nombreProcesoPostgrado) >= 0) {
                    throw new MensajeException("El nombre del archivo no es válido.");
                }
            }
            nombreInstanciaProceso = this.getNombreInstanciaProceso();
            if (isIteracion() && (nombreInstanciaProceso != null)) {
                this.inicializarInstancia(nombreInstanciaProceso);
                idSolicitud = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
                solicitud = logica.getLogAperturaPostgrado().leerSolicitudAperturaNivel2(idSolicitud);
                solicitud = llenarDatosActividad(solicitud, nombreInstanciaProceso);
                solicitud = logica.getLogAperturaPostgrado().guardarYClonarSolicitudApertura(solicitud);
            }
            if ((nombreInstanciaProceso == null) && (!isIteracion())) {
                prjSession.instantiateProject(nombreProcesoPostgrado);
                nombreInstanciaProceso = prjSession.getName();
                solicitud = llenarDatosActividad(null, nombreInstanciaProceso);
                solicitud = logica.getLogAperturaPostgrado().nuevoSolicitudApertura(solicitud);
                prjSession.setProperty(Constantes.Atributo.idSolicitudProceso, solicitud.getIdSolicitudApertura() + "");
                solicitud = logica.getLogAperturaPostgrado().clonarSolicitudApertura(solicitud);

            }
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividadPostgrado);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }

            prjSession.setNodeProperty(nombreActividadPostgrado, Constantes.Atributo.idSolicitudActividad, solicitud.getIdSolicitudApertura() + "");
            usrSession.startActivity(nombreInstanciaProceso, nombreActividadPostgrado);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividadPostgrado);

                //enviar mail de notificacion
            int idDecano = new Integer(logica.leerConfiguracionPorNombre(Constantes.Configuracion.Decano.getNombreEnBD()).getValor());
            String to = logica.leerPersona(idDecano).getCorreo();
            int idSolicitudCompleta = solicitud.getFkParent();
            solicitud = logica.getLogAperturaPostgrado().leerSolicitudAperturaNivel2(idSolicitudCompleta);
            String subject = Constantes.MensajesCorreo.tituloCorreo + "Revisión de Solicitud de Apertura de Postgrado pendiente";
            String message = Constantes.TipoSolicitud.AperturaPostgrado + "_" + solicitud.getIdSolicitudApertura() + ": " +
                    Constantes.SolicitarAperturaPostgrado.revisarSolicitud + "\n\n" + "Título: " + solicitud.toString() + "\n" +
                    "Solicitante: " + logica.leerPersona(solicitud.getFkIdProfesor()).toString() + "\n\n" +
                    "La solicitud está en espera de su evaluación." +
                    "\n\n" + "Puede realizar la actividad dirigiéndose a la sección actividades pendientes del sistema."
                    + Constantes.MensajesCorreo.referenciaSistema;
            SendMailEspol sendMail = new SendMailEspol(to, subject, message);
            sendMail.send();

        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception ex) {
            ex.printStackTrace();
            Logger.getLogger(CTRL_SolicitarAperturaPostgrado.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }

    private Solicitudaperturapostgrado llenarDatosActividad(Solicitudaperturapostgrado solicitudtmp, String nombreInstanciaProceso) throws MensajeException, Exception {
        Solicitudaperturapostgrado solicitud = new Solicitudaperturapostgrado();
        if (solicitudtmp == null) {
            solicitud = new Solicitudaperturapostgrado();
        } else {
            solicitud = solicitudtmp;
        }
        try {
            if (!isIteracion()) {
                solicitud.setTipo((String) gui.getDdlTipoPostgrado().getSelected());
                Profesor profesor = logica.leerProfesorPorUsuario(usuario.getUsuario());
                solicitud.setFkIdProfesor(profesor.getIdProfesor());
                solicitud.setEstado(Constantes.EstadoSolicitud.Activa.toString());
                solicitud.setNombreinstanciaproceso(nombreInstanciaProceso);
//                Vector<Persona> decano = logica.leerPersonaPorRol("Decano");
//                solicitud.setFkIdDecano(decano.get(0).getIdPersona());
               
            }
            solicitud.setTema((String) gui.getTxtaTema().getValue());
            solicitud.setObservacionProfesor((String) gui.getTxtaObservaciones().getText());
            
            if (!gui.getFuArchivo().getValueAsString(facesContext).equals("")) {
                String nombreArchivo = (String) gui.getFuArchivo().getValueAsString(facesContext);
                solicitud.setNombreArchivo(nombreArchivo);
                UploadedFile uploadedFile = gui.getFuArchivo().getUploadedFile();
                HttpServletRequest servletRequest = (HttpServletRequest) externalContext.getRequest();
                String pathRaiz = (String) servletRequest.getAttribute("path");
                String pathCarpetas = "/" + "Archivos" + "/" + "Solicitar Apertura Postgrado";
                File carpeta = new File(pathRaiz + pathCarpetas + "/" + nombreInstanciaProceso);
                carpeta.mkdirs();
                File file = new File(pathRaiz + pathCarpetas + "/" + nombreInstanciaProceso + "/" + nombreArchivo);
                uploadedFile.write(file);
                String relativePath = pathCarpetas + "/" + nombreInstanciaProceso + "/" + nombreArchivo;
                solicitud.setPathArchivoAdjunto(relativePath);
            }

        } catch (FileNotFoundException ex) {
            throw new MensajeException("No se encuentra el archivo especificado");

        } catch (MensajeException ex) {
            throw ex;
        } catch (SQLException ex) {
            Logger.getLogger(CTRL_SolicitarAperturaPostgrado.class.getName()).log(Level.SEVERE, null, ex);

        }
        return solicitud;

    }
}
